* STATA Do file for Chapter 3, Mark R. Beissinger, The Revolutionary City  
version 14
clear all
set more off
log using Logfiles\chapter3.log, replace
* ======================================================================
* STATISTICAL RESULTS APPEARING IN CHAPTER 3, THE REVOLUTIONARY CITY
* Results reported in Chapter 3 
* Author: Mark R. Beissinger  
* Date:  January 2022  
* Princeton, NJ 
* ======================================================================
* BEFORE RUNNING, YOU MUST SET THE DEFAULT PATH FOR WHERE THE DATA
*   FILES RESIDE
* ======================================================================
* The following datafiles were used in this chapter:
*   Panel data for revolutionary episodes--revspredictbycntryyr.dta
*   Multiple imputation panel data--revspredictbycntryyrmi.dta
* ======================================================================
* Output produced:  Logfiles\chapter3.log
* ======================================================================

use revspredictbycntryyr.dta

* ======================================================================
* BIVARIATE RELATIONS FOR URBAN CIVIC AND SOCIAL REVOLUTIONARY EPISODES
*   (FIGURES 3.1 TO 3.5)
* ======================================================================
* Graphs of marginal effects--results were loaded in Excel spreadsheets
* Only independent states included to keep samples analogous.

* Figure 3.1
xtcloglog urbancivicny  polityl c.polityl#c.polityl c.time1##c.time1##c.time1 if indstate==1, vce(robust) eform nolog
margins, at(polityl=-10) at(polityl=-9) at(polityl=-8) at(polityl=-7) at(polityl=-6) at(polityl=-5) at(polityl=-4) at(polityl=-3) at(polityl=-2) at(polityl=-1) at(polityl=0) at(polityl=1) at(polityl=2) at(polityl=3) at(polityl=4) at(polityl=5) at(polityl=6) at(polityl=7) at(polityl=8) at(polityl=9) at(polityl=10) predict(pr)
xtcloglog leftistny polityl c.time1##c.time1##c.time1 if indstate==1, vce(robust) eform nolog
margins, at(polityl=-10) at(polityl=-9) at(polityl=-8) at(polityl=-7) at(polityl=-6) at(polityl=-5) at(polityl=-4) at(polityl=-3) at(polityl=-2) at(polityl=-1) at(polityl=0) at(polityl=1) at(polityl=2) at(polityl=3) at(polityl=4) at(polityl=5) at(polityl=6) at(polityl=7) at(polityl=8) at(polityl=9) at(polityl=10) predict(pr)

* On relationship of non-democratic regime-types to probability of onset for urban civic and social revolutionary episodes (Geddes data)
xtcloglog urbancivicny  gedpartyautoc gedmilautoc gedmonautoc gedpersautoc c.time1##c.time1##c.time1 if indstate==1, vce(robust) eform nolog
xtcloglog leftistny  gedpartyautoc gedmilautoc gedmonautoc gedpersautoc c.time1##c.time1##c.time1 if indstate==1, vce(robust) eform nolog

* Figure 3.2
* No statistically significant relationship between yrsincleaderinpower and social revolutionary episodes (various polynomial forms tested)
xtcloglog urbancivicny yrsincleaderinpower c.time1##c.time1##c.time1 if indstate==1, vce(robust) eform nolog
margins, at(yrsincleaderinpower=(0(1)35)) predict(pr)
xtcloglog leftistny yrsincleaderinpower c.time1##c.time1##c.time1 if indstate==1, vce(robust) eform nolog
margins, at(yrsincleaderinpower=(0(1)35)) predict(pr)

* V-Dem executive corruption measure
xtcloglog urbancivicny v2x_execorr c.time1##c.time1##c.time1 if indstate==1,  eform nolog vce(robust)
margins, atmeans at(v2x_execorr=(0 .1 .2 .3 .4 .5 .6 .7 .8 .9 1.0)) predict(pr)
* Comparing bottom 10 percent, the mean, the top 90-99 percent
sum v2x_execorr, detail
margins, at(v2x_execorr=(.060949 .4693745 .877365 .962508)) predict(pr)
xtcloglog leftistny v2x_execorr c.time1##c.time1##c.time1 if indstate==1,  eform nolog vce(robust)
margins, at(v2x_execorr=(0 .1 .2 .3 .4 .5 .6 .7 .8 .9 1.0)) predict(pr)

* Figure 3.3
xtcloglog urbancivicny c.gdppcthl##c.gdppcthl c.time1##c.time1##c.time1 if indstate==1, vce(robust) eform nolog
margins, at(gdppcthl=(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15)) predict(pr)
xtcloglog leftistny gdppcthl c.time1##c.time1##c.time1 if indstate==1, vce(robust) eform nolog
margins, at(gdppcthl=(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15)) predict(pr)

* Figure 3.4
xtcloglog urbancivicny gdppcgrow1yrl c.time1##c.time1##c.time1 if indstate==1, vce(robust) eform nolog
margins, at(gdppcgrow1yrl=(-10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10)) predict(pr)
xtcloglog leftistny gdppcgrow1yrl c.time1##c.time1##c.time1 if indstate==1, vce(robust) eform nolog
margins, at(gdppcgrow1yrl=(-10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10)) predict(pr)

* Economic growth, using the previous three years prior to onset
xtcloglog leftistny gdppcgrow3yrsl c.time1##c.time1##c.time1 if indstate==1, vce(robust) eform nolog
xtcloglog urbancivicny gdppcgrow3yrsl c.time1##c.time1##c.time1 if indstate==1, vce(robust) eform nolog

* On the relationship of economic growth to urban civic contention among lower-middle income countries
ttest gdppcgrow3yrsl if gdppcquartersl==2 & indstate==1, by(urbancivicny)
* Absence of relationship outside of lower-middle incomes
xtcloglog urbancivicny i.gdppcquartersl##c.gdppcgrow1yrl c.time1##c.time1##c.time1 if indstate==1, vce(robust) eform nolog

* Lack of direct bivariate relationship between oil production and revolution
xtcloglog urbancivicny lnoill c.time1##c.time1##c.time1 if indstate==1, vce(robust) eform nolog
xtcloglog leftistny lnoill c.time1##c.time1##c.time1 if indstate==1, vce(robust) eform nolog

* ==========================================================
* MODELS FOR URBAN CIVIC REVOLUTIONARY EPISODES (TABLE 3.1)
* ==========================================================
* Table 3.1:  Model for explaining urban civic revolutionary episodes 
*  	Territories with colonial status, territories of independent states, and states under foreign occupation excluded from sample

* Create common sample for comparison of BIC and AIC
quietly: xtcloglog urbancivicny lnpopl gdppcthl gdppcthl2 gdppcgrow1yrl polityl polityl2 yrsincleaderinpower v2x_execorr lnoill postcoldwar if  indstate==1, eform nolog
generate sample=0
replace sample=1 if e(sample)
*  Likelihood ratio test for whether inclusion of time controls is necessary when postcoldwar dummy is included
quietly: xtcloglog urbancivicny lnpopl gdppcthl gdppcthl2 gdppcgrow1yrl polityl polityl2 postcoldwar if indstate==1
estimates store mod1
quietly: xtcloglog urbancivicny lnpopl gdppcthl gdppcthl2 gdppcgrow1yrl polityl polityl2 postcoldwar time1 timesq timecub if indstate==1
estimates store mod2
lrtest mod1 mod2, stats
* RESULT:  No need to include time controls if postcoldwar included
drop _est_mod1 _est_mod2

* Model 1, with robust errors
xtcloglog urbancivicny lnpopl gdppcthl gdppcthl2 gdppcgrow1yrl polityl polityl2 postcoldwar if indstate==1, vce(robust) eform nolog
xtcloglog urbancivicny lnpopl gdppcthl gdppcthl2 gdppcgrow1yrl polityl polityl2 postcoldwar if indstate==1, nolog eform
quadchk , nooutput
* Passed
* Compute AIC/BIC
quietly: xtcloglog urbancivicny lnpopl gdppcthl gdppcthl2 gdppcgrow1yrl polityl polityl2 postcoldwar if indstate==1 & sample==1, nolog eform
estat ic
* Computing percent correctly predicted with above-average risk
quietly: xtcloglog urbancivicny lnpopl gdppcthl gdppcthl2 gdppcgrow1yrl polityl polityl2 postcoldwar if indstate==1, vce(robust) eform nolog
predict prmod1, pr
* Correctly predicted positive cases
sum urbancivicny if e(sample)
local prmean=r(mean)
count if urbancivicny==1 & prmod1>`prmean' & e(sample)
local corposcount=r(N)
count if urbancivicny==1 & prmod1<=`prmean' & e(sample)
local falseposcount=r(N)
display (`corposcount')/(`corposcount' + `falseposcount')
* Correctly predicted negative cases
count if urbancivicny==0 & prmod1>`prmean' & e(sample)
local falsenegcount=r(N)
count if urbancivicny==0 & prmod1<=`prmean' & e(sample)
local cornegcount=r(N)
display (`falsenegcount')/(`cornegcount' + `falsenegcount')
* AUC
roctab urbancivicny prmod1 if e(sample)
macro drop _all
drop prmod1

* Model 2, with robust errors
xtcloglog urbancivicny lnpopl gdppcthl gdppcthl2 gedpartyautoc gedmilautoc gedmonautoc gedpersautoc postcoldwar if indstate==1,  eform nolog vce(robust)
xtcloglog urbancivicny lnpopl gdppcthl gdppcthl2 gedpartyautoc gedmilautoc gedmonautoc gedpersautoc postcoldwar if indstate==1,  eform nolog
quadchk , nooutput
* Passed
* Computing percent correctly predicted with above-average risk
quietly: xtcloglog urbancivicny lnpopl gdppcthl gdppcthl2 gedpartyautoc gedmilautoc gedmonautoc gedpersautoc postcoldwar if indstate==1,  eform nolog vce(robust)
predict prmod2, pr
* Correctly predicted positive cases
sum urbancivicny if e(sample)
local prmean=r(mean)
count if urbancivicny==1 & prmod2>`prmean' & e(sample)
local corposcount=r(N)
count if urbancivicny==1 & prmod2<=`prmean' & e(sample)
local falseposcount=r(N)
display (`corposcount')/(`corposcount' + `falseposcount')
* Correctly predicted negative cases
count if urbancivicny==0 & prmod2>`prmean' & e(sample)
local falsenegcount=r(N)
count if urbancivicny==0 & prmod2<=`prmean' & e(sample)
local cornegcount=r(N)
display (`falsenegcount')/(`cornegcount' + `falsenegcount')
* AUC
roctab urbancivicny prmod2 if e(sample)
macro drop _all
drop prmod2

* Model 3, with robust errors
* 22 integration points used after failing quadrature check at 12 and testing for alternative methods of integration
xtcloglog urbancivicny lnpopl gdppcthl gdppcthl2 gdppcgrow1yrl polityl polityl2 yrsincleaderinpower v2x_execorr lnoill postcoldwar if indstate==1, vce(robust) eform nolog intpoints(22)
xtcloglog urbancivicny lnpopl gdppcthl gdppcthl2 gdppcgrow1yrl polityl polityl2 yrsincleaderinpower v2x_execorr lnoill postcoldwar if indstate==1, eform nolog intpoints(22)
quadchk 12 22, nofrom nooutput
* Passed
* Compute AIC/BIC
quietly: xtcloglog urbancivicny lnpopl gdppcthl gdppcthl2 gdppcgrow1yrl polityl polityl2 yrsincleaderinpower v2x_execorr lnoill postcoldwar if indstate==1 & sample==1, eform nolog intpoints(22)
estat ic
* Computing percent correctly predicted with above-average risk
quietly: xtcloglog urbancivicny lnpopl gdppcthl gdppcthl2 gdppcgrow1yrl polityl polityl2 yrsincleaderinpower v2x_execorr lnoill postcoldwar if indstate==1, vce(robust) eform nolog intpoints(22)
predict prmod3, pr
* Correctly predicted positive cases
sum urbancivicny if e(sample)
local prmean=r(mean)
count if urbancivicny==1 & prmod3>`prmean' & e(sample)
local corposcount=r(N)
count if urbancivicny==1 & prmod3<=`prmean' & e(sample)
local falseposcount=r(N)
display (`corposcount')/(`corposcount' + `falseposcount')
* Correctly predicted negative cases
count if urbancivicny==0 & prmod3>`prmean' & e(sample)
local falsenegcount=r(N)
count if urbancivicny==0 & prmod3<=`prmean' & e(sample)
local cornegcount=r(N)
display (`falsenegcount')/(`cornegcount' + `falsenegcount')
* AUC
roctab urbancivicny prmod3 if e(sample)
macro drop _all
drop prmod3

* Model 4, with robust errors
* 22 integration points used after failing quadrature check at 12 and testing for alternative methods of integration
xtcloglog urbancivicny lnpopl gdppcthl gdppcthl2 polityl polityl2 yrsincleaderinpower v2x_execorr lnoill postcoldwar if indstate==1, vce(robust) eform nolog intpoints(22)
xtcloglog urbancivicny lnpopl gdppcthl gdppcthl2 polityl polityl2 yrsincleaderinpower v2x_execorr lnoill postcoldwar if indstate==1, eform nolog intpoints(22)
quadchk 12 22, nofrom nooutput
* Passed
* Compute AIC/BIC
quietly: xtcloglog urbancivicny lnpopl gdppcthl gdppcthl2 polityl polityl2 yrsincleaderinpower v2x_execorr lnoill postcoldwar if indstate==1 & sample==1, eform nolog intpoints(22)
estat ic
* Computing percent correctly predicted with above-average risk
quietly: xtcloglog urbancivicny lnpopl gdppcthl gdppcthl2 polityl polityl2 yrsincleaderinpower v2x_execorr lnoill postcoldwar if indstate==1, vce(robust) eform nolog intpoints(22)
predict prmod4, pr
* Correctly predicted positive cases
sum urbancivicny if e(sample)
local prmean=r(mean)
count if urbancivicny==1 & prmod4>`prmean' & e(sample)
local corposcount=r(N)
count if urbancivicny==1 & prmod4<=`prmean' & e(sample)
local falseposcount=r(N)
display (`corposcount')/(`corposcount' + `falseposcount')
* Correctly predicted negative cases
count if urbancivicny==0 & prmod4>`prmean' & e(sample)
local falsenegcount=r(N)
count if urbancivicny==0 & prmod4<=`prmean' & e(sample)
local cornegcount=r(N)
display (`falsenegcount')/(`cornegcount' + `falsenegcount')
* AUC
roctab urbancivicny prmod4 if e(sample)
macro drop _all
drop prmod4

* ++++++++++++++
* Pooled models
* ++++++++++++++
* Pooled complementary log-log model
cloglog urbancivicny lnpopl gdppcthl gdppcthl2 polityl polityl2 yrsincleaderinpower v2x_execorr lnoill postcoldwar if indstate==1 , vce(robust) eform nolog
* Compute AIC/BIC
quietly: cloglog urbancivicny lnpopl gdppcthl gdppcthl2 polityl polityl2 yrsincleaderinpower v2x_execorr lnoill postcoldwar if indstate==1 & sample==1, eform nolog
estat ic
* Computing percent correctly predicted with above-average risk
quietly: cloglog urbancivicny lnpopl gdppcthl gdppcthl2 polityl polityl2 yrsincleaderinpower v2x_execorr lnoill postcoldwar if indstate==1 , vce(robust) eform
predict prmod5, pr
* Correctly predicted positive cases
sum urbancivicny if e(sample)
local prmean=r(mean)
count if urbancivicny==1 & prmod5>`prmean' & e(sample)
local corposcount=r(N)
count if urbancivicny==1 & prmod5<=`prmean' & e(sample)
local falseposcount=r(N)
display (`corposcount')/(`corposcount' + `falseposcount')
* Incorrectly predicted negative cases
count if urbancivicny==0 & prmod5>`prmean' & e(sample)
local falsenegcount=r(N)
count if urbancivicny==0 & prmod5<=`prmean' & e(sample)
local cornegcount=r(N)
display (`falsenegcount')/(`cornegcount' + `falsenegcount')
macro drop _all
drop prmod5
* Area under the ROC curve
quietly:  cloglog urbancivicny lnpopl gdppcthl gdppcthl2 polityl polityl2 yrsincleaderinpower v2x_execorr lnoill postcoldwar if indstate==1 , vce(robust) eform
predict double xb, xb
roctab urbancivicny xb if e(sample)
drop xb

* Firth penalized logit
firthlogit urbancivicny lnpopl gdppcthl gdppcthl2 polityl polityl2 yrsincleaderinpower v2x_execorr lnoill postcoldwar if indstate==1, or nolog
* Compute AIC/BIC
quietly: firthlogit urbancivicny lnpopl gdppcthl gdppcthl2 polityl polityl2 yrsincleaderinpower v2x_execorr lnoill postcoldwar if indstate==1 & sample==1,  or nolog
estat ic
* Computing percent correctly predicted with above-average risk
quietly: firthlogit urbancivicny lnpopl gdppcthl gdppcthl2 polityl polityl2 yrsincleaderinpower v2x_execorr lnoill postcoldwar if indstate==1, or nolog
predict prmod6, xb
quietly replace prmod6 = invlogit(prmod6)
* Correctly predicted positive cases
sum urbancivicny if e(sample)
local prmean=r(mean)
count if urbancivicny==1 & prmod6>`prmean' & e(sample)
local corposcount=r(N)
count if urbancivicny==1 & prmod6<=`prmean' & e(sample)
local falseposcount=r(N)
display (`corposcount')/(`corposcount' + `falseposcount')
* Correctly predicted negative cases
count if urbancivicny==0 & prmod6>`prmean' & e(sample)
local falsenegcount=r(N)
count if urbancivicny==0 & prmod6<=`prmean' & e(sample)
local cornegcount=r(N)
display (`falsenegcount')/(`cornegcount' + `falsenegcount')
macro drop _all
drop prmod6
* Area under the ROC curve
predict double xb, xb
roctab urbancivicny xb if e(sample)
drop xb
*
* Drop comparison sample variable
drop sample

* ++++++++++++++++++++++++++
* Multiple imputation models
* ++++++++++++++++++++++++++
* Use multiple imputation sample previously generated for 20 imputed samples
* See robustness tests for details on imputation process and post-imputation tests
clear
use revspredictbycntryyrmi.dta
* Calculate estimation for Model 4--panel complementary log-log model
mi estimate, post dots eform saving(miest, replace): xtcloglog urbancivicny lnpopl c.gdppcthl##c.gdppcthl c.polityl##c.polityl yrsincleaderinpower v2x_execorr lnoill postcoldwar, vce(robust)
* Model predictions
mi predict xburbmi using miest, xb
generate prurbmi = invlogit(xburbmi)
* Obtain accuracy of prediction
* True positive rate
sum urbancivicny if e(N_mi)
local prmean=r(mean)
count if urbancivicny==1 & prurbmi>`prmean' 
local corposcount=r(N)
count if urbancivicny==1 & prurbmi<=`prmean' 
local falseposcount=r(N)
display (`corposcount')/(`corposcount' + `falseposcount')
* False positive rate
count if urbancivicny==0 & prurbmi>`prmean' 
local falsenegcount=r(N)
count if urbancivicny==0 & prurbmi<=`prmean'
local cornegcount=r(N)
display (`falsenegcount')/(`cornegcount' + `falsenegcount')
macro drop _all
* Area under the ROC curve
roctab urbancivicny xburbmi
drop xburbmi

* Calculate estimation for pooled Firth model
* Can take a while to calculate
mi estimate, cmdok post saving(miest, replace) eform: firthlogit urbancivicny lnpopl c.gdppcthl##c.gdppcthl  c.polityl##c.polityl yrsincleaderinpower v2x_execorr lnoill postcoldwar, nolog
* Predictions of Firth model
mi predict xburbfirthmi using miest, xb
generate prurbfirthmi = invlogit(xburbfirthmi)
* Obtain accuracy of prediction
sum urbancivicny if e(N_mi)
local prmean=r(mean)
* True positive rate
count if urbancivicny==1 & prurbfirthmi>`prmean' 
local corposcount=r(N)
count if urbancivicny==1 & prurbfirthmi<=`prmean' 
local falseposcount=r(N)
display (`corposcount')/(`corposcount' + `falseposcount')
* False positive rate
count if urbancivicny==0 & prurbfirthmi>`prmean' 
local falsenegcount=r(N)
count if urbancivicny==0 & prurbfirthmi<=`prmean'
local cornegcount=r(N)
display (`falsenegcount')/(`cornegcount' + `falsenegcount')
macro drop _all
* Area under the ROC curve
roctab urbancivicny xburbfirthmi
drop xburbfirthmi


* =====================================================================
* MODELS FOR TABLE 3.2, FACTORS ASSOCIATED WITH ONSET OF REVOLUTIONARY 
*   CONTENTION AND ATTEMPTED COUPS--MULTIPLE IMPUTATION MODELS
* =====================================================================
* All revolutionary episodes
mi estimate, post dots eform saving(miest, replace): xtcloglog revny lnpopl gdppcthl gdppcgrow1yrl c.polityl##c.polityl yrsincleaderinpower v2x_execorr lnoill postcoldwar, vce(robust)
*
* All rural revolutionary episodes
mi estimate, post dots eform saving(miest, replace): xtcloglog ruralrevny lnpopl gdppcthl gdppcgrow1yrl c.polityl##c.polityl yrsincleaderinpower v2x_execorr lnoill postcoldwar, vce(robust)
*
* All urban revolutionary episodes
mi estimate, post dots eform saving(miest, replace): xtcloglog urbanrevny lnpopl gdppcthl gdppcgrow1yrl c.polityl##c.polityl yrsincleaderinpower v2x_execorr lnoill postcoldwar, vce(robust)
*
* Social revolutionary episodes
mi estimate, post dots eform saving(miest, replace): xtcloglog leftistny lnpopl gdppcthl gdppcgrow1yrl c.polityl##c.polityl yrsincleaderinpower v2x_execorr lnoill postcoldwar, vce(robust)
*
* Urban civic revolutionary episodes
mi estimate, post dots eform saving(miest, replace): xtcloglog urbancivicny lnpopl gdppcthl gdppcgrow1yrl c.polityl##c.polityl yrsincleaderinpower v2x_execorr lnoill postcoldwar, vce(robust)
*
* All other revolutionary episodes
mi estimate, post dots eform saving(miest, replace): xtcloglog noturbancivorleftny lnpopl gdppcthl gdppcgrow1yrl c.polityl##c.polityl yrsincleaderinpower v2x_execorr lnoill postcoldwar, vce(robust)
*
* Coup attempts
mi estimate, post dots eform saving(miest, replace): xtcloglog coupattempt lnpopl gdppcthl gdppcgrow1yrl c.polityl##c.polityl yrsincleaderinpower v2x_execorr lnoill postcoldwar, vce(robust)
*
* All urban revolutionary episodes, excluding urban civic episodes
mi estimate, post dots eform saving(miest, replace): xtcloglog urbanrevnocivic lnpopl gdppcthl gdppcgrow1yrl c.polityl##c.polityl yrsincleaderinpower v2x_execorr lnoill postcoldwar if urbancivicny==0, vce(robust)


* ===================================================
* COUNTRY PREDICTIONS FROM POOLED PENALIZED MODEL OF 
*   MULTIPLE IMPUTATION SAMPLE, FIGURES 3.6-3.15
* ===================================================
* Obtain average for all country-years for independent states
sum prurbfirthmi
* Figure 3.6--Tunisia
list year prurbfirthmi if country=="Tunisia" &  year>1959, clean noobs
* Figure 3.7--Serbia
list year prurbfirthmi if country=="Yugoslavia" &  year>1959, clean noobs
* Figure 3.8--Myanmar
list year prurbfirthmi if country=="Myanmar" &  year>1959, clean noobs
* Figure 3.9--Ukraine
list year prurbfirthmi if country=="Ukraine" &  year>1991, clean noobs
* Figure 3.10--South Korea
list year prurbfirthmi if country=="Korea, South" &  year>1959, clean noobs
* Figure 3.11--Czechoslovakia
list year prurbfirthmi if (country=="Czechoslovakia" | country=="Czech Republic") &  year>1959, clean noobs
* Figure 3.12--Indonesia
list year prurbfirthmi if country=="Indonesia" &  year>1959, clean noobs
* Figure 3.13--Philippines
list year prurbfirthmi if country=="Philippines" &  year>1959, clean noobs
* Figure 3.14--Mexico
list year prurbfirthmi if country=="Mexico" &  year>1959, clean noobs
* Figure 3.15--Malaysia
list year prurbfirthmi if country=="Malaysia" &  year>1959, clean noobs

drop prurbfirthmi prurbmi

log close

erase miest.ster

clear
